#pragma once
#include <stdint.h>
#include <mutex>
struct AVFrame;
void MSleep(uint64_t ms);
///////////////////////////////////////////
///// 视屏渲染接口类
///// 1.隐藏SDL实现
///// 2.渲染方案可替代
///// 3.线程安全
class XVideoView
{
public:
    enum Format
    {
        RGBA = 0,
        YUV420P, // YU12
        ARGB,
    };
    enum RenderType
    {
        SDL = 0,
        // QT,
        // XV,
    };
    virtual ~XVideoView() = default;
    static XVideoView *Create(RenderType type);
    // 初始化渲染窗口
    // @param w,h 视频分辨率
    // @param fmt 视频格式
    // @param win_id 窗口句柄，如果为空，那么会生成一个窗口
    // @return 成功返回true
    virtual bool Init(int w, int h,
                      Format fmt = RGBA,
                      void *win_id = nullptr) = 0;
    // 渲染图像 线程安全（主要是考虑和Init的互斥）
    // @param data 图像数据
    // @param linesize 图像数据行字节数，对于yuv420p，为y一行的字节数
    // 如果linesize<=0，那么根据视频格式计算（对齐方式无法确定）
    // @return 成功返回true
    virtual bool Draw(const uint8_t *data, int linesize = 0) = 0;
    virtual bool Draw(const uint8_t *y, int y_pitch,
                      const uint8_t *u, int u_pitch,
                      const uint8_t *v, int v_pitch) = 0;
    virtual bool DrawFrame(AVFrame *frame);
    // 显示缩放
    void Scale(int w, int h)
    {
        scale_w_ = w;
        scale_h_ = h;
    }

    // 清理所有的资源包括关闭窗口
    virtual void Close() = 0;

    // 处理窗口退出事件
    virtual bool IsExit() = 0;
    int render_fps() const { return render_fps_; }

protected:
    int render_fps_ = 0;
    int width_ = 0;     // 纹理宽高
    int height_ = 0;    // 纹理宽高
    Format fmt_ = RGBA; // 像素格式
    std::mutex mutex_;  // 互斥锁
    // 渲染宽高,不设置的话就全屏显示
    int scale_w_ = 0;
    int scale_h_ = 0;
    long long beg_ms_ = 0;
    int count_ = 0;
};